package lib;

import java.util.Iterator;

/**
 * Ebauche d'une liste 'faites maison'
 * 
 * TODO
 * A tester
 * A implementer dans un EnsembleMaListe
 * A compléter pour les primitives manquantes
 * A rendre itérable ( -> for(Element e :maListe))
 * 
 * @author patrick-edouard
 *
 */
public class ListePerso implements Iterable<Element> {
	
	private Element premierElement;
	private Element dernierElement;
	private Element prochainElement;
	
	public ListePerso()
	{
		this.setPremierElement(null);
		this.setProchainElement(null);
		this.dernierElement = null;
	}
	
	public void remove(Element e)
	{
		if(this.getPremierElement()!=null&&this.getPremierElement().getElementSuivant()!=null)
		{
			if(this.getPremierElement().getValeur()==e.getValeur())
			{
				this.setPremierElement(this.getPremierElement().getElementSuivant());
			}
			else
			{
				Element tmp1 = getPremierElement();
				Element tmp2 = getPremierElement().getElementSuivant();
				
				do
				{
					if(e.getValeur()==tmp2.getValeur())
					{
						tmp1=tmp2.getElementSuivant();
						break;
					}
					else
					{
						tmp1=tmp2;
						tmp2=tmp2.getElementSuivant();
					}
				}while(tmp1.getElementSuivant()!=null);
			}
		}
	}
	
	public void add(Element e)
	{
		if(this.getPremierElement()!=null)
		{
			this.dernierElement.setElementSuivant(e);
			this.dernierElement=e;
			this.dernierElement.setElementSuivant(null);
		}
		else
		{
			this.setPremierElement(e);
			this.dernierElement=e;
		}
	}

	public Element getProchainElement() {
		if(this.prochainElement==null)
		{
			this.setProchainElement(this.getPremierElement());
		}
		return prochainElement;
	}

	public void setProchainElement(Element prochainElement) {
		this.prochainElement = prochainElement;
	}

	/**
	 * @return the premierElement
	 */
	public Element getPremierElement() {
		return premierElement;
	}

	/**
	 * @param premierElement the premierElement to set
	 */
	public void setPremierElement(Element premierElement) {
		this.premierElement = premierElement;
	}

	@Override
	public Iterator<Element> iterator() {
		return (Iterator<Element>) new IteratorPerso(this);
	}
}